triangular_shell_element Derived Type

type, public, extends(shell_element) :: triangular_shell_element

Defines a three-node flat shell element.

The membrane behavior is modeled by the constant-strain triangle (CST) and the bending behavior by the Discrete Kirchhoff Triangle (DKT) of Batoz, Bathe, and Ho. The DKT element enforces the Kirchhoff hypothesis at discrete points; therefore, transverse shear deformation is neglected and the transverse shear strain and force components are always zero. This element is appropriate for thin shells.

The natural coordinates are the area coordinates of nodes 2 and 3, so nodes 1, 2, and 3 are located at , , and , respectively. Nodes should be ordered counter-clockwise when viewed from the positive local -axis; the local -axis is defined by this ordering.


Contents


Components

Type Visibility Attributes Name Initial
real(kind=real64), public :: drilling_factor = 1.0d-3

The nondimensional drilling-rotation penalty factor . The drilling stiffness is , where is the shear modulus.

type(material), public :: material

The material.

type(node), public, dimension(3) :: nodes

The element nodes.

real(kind=real64), public :: shear_correction = 5.0d0/6.0d0

The transverse shear correction factor. This value is only used by elements that include transverse shear deformation.

real(kind=real64), public :: thickness

The shell thickness.


Constructor

public interface triangular_shell_element

  • private pure function tri_init(mat, thickness, nd1, nd2, nd3) result(rst)

    Constructs a new [[triangular_shell_element]].

    Arguments

    Type IntentOptional Attributes Name
    class(material), intent(in) :: mat

    The material.

    real(kind=real64), intent(in) :: thickness

    The shell thickness. This value must be positive.

    class(node), intent(in) :: nd1

    The first node.

    class(node), intent(in) :: nd2

    The second node.

    class(node), intent(in) :: nd3

    The third node.

    Return Value type(triangular_shell_element)

    The new [[triangular_shell_element]].


Type-Bound Procedures

procedure, public :: area => shl_area

  • private pure function shl_area(this) result(rst)

    Computes the area of the element.

    Arguments

    Type IntentOptional Attributes Name
    class(shell_element), intent(in) :: this

    The shell_element object.

    Return Value real(kind=real64)

    The element area.

procedure, public :: constitutive_matrix => shl_constitutive_matrix

  • private pure function shl_constitutive_matrix(this) result(rst)

    Computes the 8-by-8 constitutive matrix relating the generalized strains to the stress resultants. where is the shear correction factor and .

    Arguments

    Type IntentOptional Attributes Name
    class(shell_element), intent(in) :: this

    The shell_element object.

    Return Value real(kind=real64), allocatable, dimension(:,:)

    The 8-by-8 constitutive matrix.

procedure, public :: evaluate_shape_function => tri_shape_function

  • private pure function tri_shape_function(this, i, s) result(rst)

    Evaluates the i-th linear shape function, , , .

    Arguments

    Type IntentOptional Attributes Name
    class(triangular_shell_element), intent(in) :: this

    The triangular_shell_element object.

    integer(kind=int32), intent(in) :: i

    The index of the shape function to evaluate.

    real(kind=real64), intent(in), dimension(:) :: s

    The natural coordinates .

    Return Value real(kind=real64)

    The value of the i-th shape function.

procedure, public :: external_force_vector => shl_ext_force_vector

  • private pure function shl_ext_force_vector(this, q, rule) result(rst)

    Computes the consistent nodal force vector, in the global coordinate system, resulting from a uniform surface traction. Only the translational degrees of freedom receive load.

    Arguments

    Type IntentOptional Attributes Name
    class(shell_element), intent(in) :: this

    The shell_element object.

    real(kind=real64), intent(in), dimension(:) :: q

    The 3-element surface traction vector (force per unit area) expressed in the global coordinate system. For a pressure acting along the local -axis, supply , where is the third row of the local_frame matrix.

    integer(kind=int32), intent(in), optional :: rule

    The integration rule. This argument is unused and is present for interface compatibility; the element uses the quadrature defined by its integration_rule routine.

    Return Value real(kind=real64), allocatable, dimension(:)

    The 6N-element force vector, where N is the number of nodes.

procedure, public :: get_dimensionality => shl_dimensionality

  • private pure function shl_dimensionality(this) result(rst)

    Gets the dimensionality of the element.

    Arguments

    Type IntentOptional Attributes Name
    class(shell_element), intent(in) :: this

    The shell_element object.

    Return Value integer(kind=int32)

    The dimensionality (always 3).

procedure, public :: get_dof_per_node => shl_dof_per_node

  • private pure function shl_dof_per_node(this) result(rst)

    Gets the number of degrees of freedom per node.

    Arguments

    Type IntentOptional Attributes Name
    class(shell_element), intent(in) :: this

    The shell_element object.

    Return Value integer(kind=int32)

    The number of degrees of freedom per node (always 6).

procedure, public :: get_node => tri_get_node

  • private pure function tri_get_node(this, i) result(rst)

    Gets the requested node from the element.

    Arguments

    Type IntentOptional Attributes Name
    class(triangular_shell_element), intent(in) :: this

    The triangular_shell_element object.

    integer(kind=int32), intent(in) :: i

    The local index of the node to retrieve.

    Return Value type(node)

    The requested node.

procedure, public :: get_node_count => tri_get_node_count

  • private pure function tri_get_node_count(this) result(rst)

    Gets the number of nodes in the element.

    Arguments

    Type IntentOptional Attributes Name
    class(triangular_shell_element), intent(in) :: this

    The triangular_shell_element object.

    Return Value integer(kind=int32)

    The number of nodes (always 3).

procedure, public :: get_node_natural_coordinates => tri_get_node_natural_coordinates

  • private pure function tri_get_node_natural_coordinates(this, i) result(rst)

    Returns the natural coordinates of the requested node.

    Arguments

    Type IntentOptional Attributes Name
    class(triangular_shell_element), intent(in) :: this

    The triangular_shell_element object.

    integer(kind=int32), intent(in) :: i

    The local index of the node.

    Return Value real(kind=real64), allocatable, dimension(:)

    The 2-element natural coordinate vector of the node.

procedure, public :: integration_rule => tri_integration_rule

  • private pure subroutine tri_integration_rule(this, pts, wts)

    Returns the three-point interior quadrature rule for triangles, which integrates quadratic polynomials exactly.

    Arguments

    Type IntentOptional Attributes Name
    class(triangular_shell_element), intent(in) :: this

    The triangular_shell_element object.

    real(kind=real64), intent(out), allocatable, dimension(:,:) :: pts

    The 2-by-3 matrix of integration point natural coordinates.

    real(kind=real64), intent(out), allocatable, dimension(:) :: wts

    The 3 integration weights.

procedure, public :: jacobian => shl_jacobian

  • private pure function shl_jacobian(this, s) result(rst)

    Computes the 2-by-2 Jacobian matrix of the mapping from natural to local coordinates.

    Arguments

    Type IntentOptional Attributes Name
    class(shell_element), intent(in) :: this

    The shell_element object.

    real(kind=real64), intent(in), dimension(:) :: s

    The natural coordinates at which to evaluate the Jacobian.

    Return Value real(kind=real64), allocatable, dimension(:,:)

    The 2-by-2 Jacobian matrix.

procedure, public :: local_coordinates => shl_local_coordinates

  • private pure function shl_local_coordinates(this) result(rst)

    Computes the in-plane nodal coordinates in the element's local coordinate system. Node 1 is located at the local origin.

    Arguments

    Type IntentOptional Attributes Name
    class(shell_element), intent(in) :: this

    The shell_element object.

    Return Value real(kind=real64), allocatable, dimension(:,:)

    An N-by-2 matrix, where N is the number of nodes, containing the local and coordinates of each node.

procedure, public :: local_frame => shl_local_frame

  • private pure function shl_local_frame(this) result(rst)

    Computes the direction cosine matrix of the element's local coordinate system. The rows of the matrix are the local , , and unit vectors expressed in global coordinates; therefore, .

    Arguments

    Type IntentOptional Attributes Name
    class(shell_element), intent(in) :: this

    The shell_element object.

    Return Value real(kind=real64), allocatable, dimension(:,:)

    The 3-by-3 direction cosine matrix.

procedure, public :: mass_matrix => shl_mass_matrix

  • private pure function shl_mass_matrix(this, rule) result(rst)

    Computes the consistent element mass matrix in the global coordinate system.

    Arguments

    Type IntentOptional Attributes Name
    class(shell_element), intent(in) :: this

    The shell_element object.

    integer(kind=int32), intent(in), optional :: rule

    The integration rule. This argument is unused and is present for interface compatibility; the element uses the quadrature defined by its integration_rule routine.

    Return Value real(kind=real64), allocatable, dimension(:,:)

    The 6N-by-6N mass matrix, where N is the number of nodes.

procedure, public :: rotation_matrix => shl_rotation_matrix

  • private pure function shl_rotation_matrix(this) result(rst)

    Computes the transformation matrix relating the global element displacement vector to the local element displacement vector such that . The matrix is block diagonal with the 3-by-3 direction cosine matrix repeated for the translations and rotations of each node.

    Arguments

    Type IntentOptional Attributes Name
    class(shell_element), intent(in) :: this

    The shell_element object.

    Return Value real(kind=real64), allocatable, dimension(:,:)

    The 6N-by-6N transformation matrix, where N is the number of nodes.

procedure, public :: shape_function_gradient => shl_shape_function_gradient

  • private pure function shl_shape_function_gradient(this, s) result(rst)

    Computes the derivatives of the shape functions with respect to the local and coordinates, .

    Arguments

    Type IntentOptional Attributes Name
    class(shell_element), intent(in) :: this

    The shell_element object.

    real(kind=real64), intent(in), dimension(:) :: s

    The natural coordinates at which to evaluate the derivatives.

    Return Value real(kind=real64), allocatable, dimension(:,:)

    A 2-by-N matrix, where N is the number of nodes, containing in the first row and in the second row.

procedure, public :: shape_function_matrix => shl_shape_function_matrix

  • private pure function shl_shape_function_matrix(this, s) result(rst)

    Computes the 6-by-6N shape function matrix interpolating the local nodal quantities with the element's linear (triangle) or bilinear (quadrilateral) shape functions. This interpolation is used to form the mass matrix and the external force vector.

    Arguments

    Type IntentOptional Attributes Name
    class(shell_element), intent(in) :: this

    The shell_element object.

    real(kind=real64), intent(in), dimension(:) :: s

    The natural coordinates at which to evaluate the matrix.

    Return Value real(kind=real64), allocatable, dimension(:,:)

    The 6-by-6N shape function matrix, where N is the number of nodes.

procedure, public :: shape_function_natural_gradient => tri_shape_function_natural_gradient

  • private pure function tri_shape_function_natural_gradient(this, s) result(rst)

    Computes the derivatives of the linear shape functions with respect to the natural coordinates.

    Arguments

    Type IntentOptional Attributes Name
    class(triangular_shell_element), intent(in) :: this

    The triangular_shell_element object.

    real(kind=real64), intent(in), dimension(:) :: s

    The natural coordinates .

    Return Value real(kind=real64), allocatable, dimension(:,:)

    The 2-by-3 matrix of derivatives.

procedure, public :: stiffness_matrix => shl_stiffness_matrix

  • private pure function shl_stiffness_matrix(this, rule) result(rst)

    Computes the element stiffness matrix in the global coordinate system. The local stiffness matrix is where is the drilling-rotation operator. The global matrix is .

    Arguments

    Type IntentOptional Attributes Name
    class(shell_element), intent(in) :: this

    The shell_element object.

    integer(kind=int32), intent(in), optional :: rule

    The integration rule. This argument is unused and is present for interface compatibility; the element uses the quadrature defined by its integration_rule routine.

    Return Value real(kind=real64), allocatable, dimension(:,:)

    The 6N-by-6N stiffness matrix, where N is the number of nodes.

procedure, public :: strain => shl_strain

  • private pure function shl_strain(this, displacement, s) result(rst)

    Computes the generalized strain vector, in the local coordinate system, at the specified natural coordinate. The components are ordered as .

    Arguments

    Type IntentOptional Attributes Name
    class(shell_element), intent(in) :: this

    The shell_element object.

    real(kind=real64), intent(in), dimension(:) :: displacement

    The 6N-element displacement vector in the global coordinate system, where N is the number of nodes.

    real(kind=real64), intent(in), dimension(:) :: s

    The natural coordinates at which to evaluate the strain.

    Return Value real(kind=real64), allocatable, dimension(:)

    The 8-element generalized strain vector.

procedure, public :: strain_displacement_matrix => tri_strain_disp_matrix

  • private pure function tri_strain_disp_matrix(this, s) result(rst)

    Computes the 8-by-18 generalized strain-displacement matrix in the local coordinate system. Rows 1-3 contain the constant-strain membrane terms, rows 4-6 the DKT curvature terms, and rows 7-8 (the transverse shear strains) are zero as the DKT formulation neglects transverse shear deformation.

    Arguments

    Type IntentOptional Attributes Name
    class(triangular_shell_element), intent(in) :: this

    The triangular_shell_element object.

    real(kind=real64), intent(in), dimension(:) :: s

    The natural coordinates .

    Return Value real(kind=real64), allocatable, dimension(:,:)

    The 8-by-18 strain-displacement matrix.

procedure, public :: stress => shl_stress

  • private pure function shl_stress(this, displacement, s) result(rst)

    Computes the stress-resultant vector, in the local coordinate system, at the specified natural coordinate. The components are ordered as . The surface stresses may be recovered as .

    Arguments

    Type IntentOptional Attributes Name
    class(shell_element), intent(in) :: this

    The shell_element object.

    real(kind=real64), intent(in), dimension(:) :: displacement

    The 6N-element displacement vector in the global coordinate system, where N is the number of nodes.

    real(kind=real64), intent(in), dimension(:) :: s

    The natural coordinates at which to evaluate the stress resultants.

    Return Value real(kind=real64), allocatable, dimension(:)

    The 8-element stress-resultant vector.